﻿#ifndef TEST_SUITE_H
#define TEST_SUITE_H

#include <QObject>

/**
 * @brief	Registra uma instância da classe de teste passada como par6ametro na suite de testes. 
 *
 * @param	className	Nome da classe. 
 **/
#define REGISTER_TEST_CLASS(ClassName) TestSuite::TestHandler ClassName##Handler(new ClassName());

/**
 * @class	TestSuit
 *
 * @brief	Suite de teste implementada como um singleton para agrupar todos os casos de teste. 
**/
class TestSuite
{
public:
	/**
	 * @class	TestHandler
	 *
	 * @brief	Container para um objeto que representa um teste. 
	**/
	class TestHandler
	{
	public:
		TestHandler(QObject * testObject) 
		{
			m_testObject = testObject; 
			TestSuite::instance().registerTest(testObject);
		}

		~TestHandler() { delete m_testObject; }

	private:
		//! Instância do objeto teste.
		QObject * m_testObject;
	};

public:
	~TestSuite() {}

	static TestSuite & instance();

	/**
	 * @brief	Registra um novo teste à suite de testes.
	 *
	 * @param	testObject	Novo teste. 
	**/
	void registerTest(QObject * testObject) { m_testList.append(testObject); }

	/**
	 * @brief	Executa todos os casos de teste de todos os testes registrados na suite. 
	 *
	 * @param	breakOnFairule	TRUE para interromper a execução dos testes se encontrar uma falha. 
	 *
	 * @return	TRUE caso todos os testes tenham sido executados com sucesso. 
	**/
	bool run(bool breakOnFairule = true);

private:
	TestSuite();

	//! Lista de testes registrados
	QList<QObject*> m_testList;
};


#endif
